package com.fortune.conf;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fortune.entity.NewsEntity;
import com.fortune.mapper.NewsMapper;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.*;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.*;

public class TOUTIAOPageNewsSpider {
    private NewsMapper newsMapper;

    public void detailsPage(WebDriver driver,String titleStr,String typeCode){
        NewsEntity newsEntity = new NewsEntity();

        // 获取文章容器的HTML内容
        String htmlContent = null;
        try {
            //普通文章 titleStr 获取上个方法已获取
            htmlContent = driver.findElement(By.cssSelector(".article-content")).getAttribute("innerHTML");
            if(StringUtils.isBlank(titleStr)){
                titleStr = driver.findElement(By.cssSelector(".article-title")).getText();
            }
        } catch (NoSuchElementException e) {
            System.out.println("htmlContent----NoSuchElementException↓↓↓↓"+e.getMessage());
        }
        if(htmlContent == null){
            //小说类型 文章 详情
            WebElement articleElement = driver.findElement(By.tagName("article"));
            htmlContent = driver.findElement(By.tagName("article")).getAttribute("innerHTML");
            if(StringUtils.isBlank(titleStr)){
                String contentStr = articleElement.getText();
                titleStr = contentStr.substring(0,htmlContent.length() > 29 ? 29:htmlContent.length()-1);
            }
        }


        if(StringUtils.isBlank(titleStr)){
            return;
        }
        newsMapper = SpringUtil.getApplicationContext().getBean(NewsMapper.class);
        QueryWrapper<NewsEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("news_title",titleStr);
        List<NewsEntity> newsEntityList = newsMapper.selectList(queryWrapper);
        if(newsEntityList != null && newsEntityList.size() > 0){
            System.out.println("标题已存在，不插入数据库>"+titleStr);
            return;
        }



        htmlContent = htmlContent.replace("&amp;","&");
        // 使用JSoup解析HTML
        Document doc = Jsoup.parse(htmlContent);

//        Elements pgcImgElements = doc.getElementsByClass("pgc-img");
//        pgcImgElements.forEach(element -> {
//
//            element.replaceWith(new Element("img"));
//
//            String src = element.attr("data-src");
//            if (src.isEmpty()) {
//                src = element.attr("src");
//            }
////            htmlContent = htmlContent.replace(src,"");
//        });


        doc.getElementsByClass("pgc-img").replaceAll(ps -> {
            Element elementDiv = new Element("div");
            elementDiv.attr("class","pgc-img");

            String src="";
            Elements imgElements = ps.select("img");
            for (int i = 0; i < imgElements.size(); i++) {
                Element element = imgElements.get(i);
                src = element.attr("data-src");
                if (src.isEmpty()) {
                    src = element.attr("src");
                }
            }

            Element elementImg = new Element("img");
            elementImg.attr("src",src);
            elementImg.attr("class","img-responsive");
            elementDiv.appendChild(elementImg);

            ps.replaceWith(elementDiv);
            return ps;
        });

        System.out.println("docdocdocdocdocdoc："+ doc.html());
        System.out.println("htmlContenthtmlContent："+ htmlContent);

        htmlContent = doc.html();
        htmlContent = htmlContent.replace("&amp;","&");

        // 提取图片链接（处理懒加载）
        List<String> imageUrls = new ArrayList<>();
        Elements imgs = doc.select("img");
        for (Element img : imgs) {
            // 优先取data-src（处理懒加载）
            String src = img.attr("data-src");
            if (src.isEmpty()) {
                src = img.attr("src");
            }
            imageUrls.add(src);
        }
        for (int i = 0; i < imageUrls.size(); i++) {
            String toutiaoImagePath = imageUrls.get(i);
            String xlcImageSuffixPath = Utils.downImage(toutiaoImagePath);
            String xlcImagePath = "https://images.xlcwx.com/xlcwx/m/community/"+xlcImageSuffixPath;
            if(i==0){
                newsEntity.setCoverUrl(xlcImagePath);
            }
            htmlContent = htmlContent.replace("<html>","");
            htmlContent = htmlContent.replace("<body>","");
            htmlContent = htmlContent.replace("<head></head>","");
            htmlContent = htmlContent.replace("</body>","");
            htmlContent = htmlContent.replace("</html>","");
            htmlContent = htmlContent.replace(toutiaoImagePath,xlcImagePath);
        }





        newsEntity.setCreateTime(new Date());
        newsEntity.setNewsTitle(titleStr);
        newsEntity.setNewsContent(htmlContent);
        newsEntity.setTypeCode(typeCode);
        newsMapper.insert(newsEntity);


        System.out.println("标题123："+ titleStr);
        System.out.println("文章详情123："+htmlContent);
        System.out.println("图片列表123："+ JSONObject.toJSONString(imageUrls));
    }
    public void getNewsList(String initPageUrl ,String typeCode) throws InterruptedException {
//        String initPageUrl = "https://www.toutiao.com/";
//        initPageUrl = "https://www.toutiao.com/article/7477355130456949300/?log_from=32c3e6639d6eb8_1745935807511";

        // 自动配置浏览器驱动
        WebDriverManager.chromedriver().setup();
        WebDriver driver = new ChromeDriverUtil().getWebDriver();
        driver.get(initPageUrl);

        if(!("https://www.toutiao.com/".equals(initPageUrl))){
            detailsPage(driver,"",typeCode);
            return ;
        }
        try {
            driver.findElement(By.xpath("//*[@id=\"root\"]/div/div[5]/div[1]/div/div/div/div[1]/div/ul/li[9]")).click();
            driver.findElement(By.xpath("//*[@id=\"root\"]/div/div[5]/div[1]/div/div/div/div[1]/div/ul/li[9]/div[2]/ul/li[4]/div")).click();
            Thread.sleep(2000);//有用别删
            driver.findElement(By.xpath("//*[@id=\"root\"]/div/div[5]/div[1]/div/div/div/div[1]/div/ul/li[8]")).click();
            Thread.sleep(1500);//有用别删 第二次点击历史，获取历史列表信息
            JavascriptExecutor js = (JavascriptExecutor) driver;
            for (int i = 0; i < 100; i++) {
                js.executeScript("document.documentElement.scrollTop=10000");
                Thread.sleep(1500);//有用别删
            }
            js.executeScript("document.documentElement.scrollTop=0");
            js.executeScript("document.documentElement.scrollTop=340");

            //获取列表
            WebDriverWait waitcard = new WebDriverWait(driver, Duration.ofSeconds(10));
            waitcard.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".feed-card-wrapper")));
            List<WebElement> elementAll = driver.findElements(By.cssSelector(".feed-card-wrapper"));

            Thread.sleep(3000);//有用，别删，否则element123获取不到数据
            elementAll.forEach(webElement -> {
                String htmlContent=null,titleStr="";
//                List<WebElement> templist = webElement.findElements(By.cssSelector(".title"));
//                System.out.println(templist.size());
                WebElement detailsElement=null;
                try {
                    //普通文章
                    detailsElement = webElement.findElement(By.cssSelector(".title"));
                    titleStr = detailsElement.getText();
                } catch (NoSuchElementException e) {
                    System.out.println("NoSuchElementException↓↓↓↓");
                    System.out.println(e.getMessage());
                }
                if(detailsElement == null ){
                    //获取只有文章的小说类型 文章信息,这个获取的是文章里的 配图
                    detailsElement = webElement.findElement(By.cssSelector(".feed-card-cover"));
                }
                if(detailsElement == null){
                    return;
                }
                //点击进入详情
                detailsElement.click();

                Set<String> allWindows = driver.getWindowHandles();
                Iterator<String> iterator = allWindows.iterator();
                String parentWindow = iterator.next(); // 父窗口句柄
                String newWindow = iterator.next(); // 新窗口句柄
                driver.switchTo().window(newWindow);

                detailsPage(driver,titleStr,typeCode);


                //关闭当前详情链接，进入下一个 详情
                driver.close();
                driver.switchTo().window(parentWindow);
                try {
                    Thread.sleep(500);
                    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", webElement);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }




    public static void main(String[] args) throws InterruptedException {
//        String initPageUrl = "https://www.toutiao.com/";
////        String initPageUrl = "https://www.toutiao.com/w/1829926500835331/?log_from=b179e1392891f8_1745658538472";
//        // 自动配置浏览器驱动
//        WebDriverManager.chromedriver().setup();
//        WebDriver driver = new ChromeDriverUtil().getWebDriver();
//        driver.get(initPageUrl);
//
//        if(!("https://www.toutiao.com/".equals(initPageUrl))){
//            detailsPage(driver,"");
//            return ;
//         }
//        try {
//            driver.findElement(By.xpath("//*[@id=\"root\"]/div/div[5]/div[1]/div/div/div/div[1]/div/ul/li[9]")).click();
//            driver.findElement(By.xpath("//*[@id=\"root\"]/div/div[5]/div[1]/div/div/div/div[1]/div/ul/li[9]/div[2]/ul/li[4]/div")).click();
//            Thread.sleep(2000);//有用别删
//            driver.findElement(By.xpath("//*[@id=\"root\"]/div/div[5]/div[1]/div/div/div/div[1]/div/ul/li[8]")).click();
//            Thread.sleep(1500);//有用别删 第二次点击历史，获取历史列表信息
//            JavascriptExecutor js = (JavascriptExecutor) driver;
//            for (int i = 0; i <1; i++) {
//                js.executeScript("document.documentElement.scrollTop=10000");
//                Thread.sleep(1500);//有用别删
//            }
//            js.executeScript("document.documentElement.scrollTop=0");
//            js.executeScript("document.documentElement.scrollTop=340");
//
//            //获取列表
//            WebDriverWait waitcard = new WebDriverWait(driver, Duration.ofSeconds(10));
//            waitcard.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".feed-card-wrapper")));
//            List<WebElement> elementAll = driver.findElements(By.cssSelector(".feed-card-wrapper"));
//
//            Thread.sleep(3000);//有用，别删，否则element123获取不到数据
//            elementAll.forEach(webElement -> {
//                String htmlContent=null,titleStr="";
////                List<WebElement> templist = webElement.findElements(By.cssSelector(".title"));
////                System.out.println(templist.size());
//                WebElement detailsElement=null;
//                try {
//                    //普通文章
//                    detailsElement = webElement.findElement(By.cssSelector(".title"));
//                    titleStr = detailsElement.getText();
//                } catch (NoSuchElementException e) {
//                    System.out.println("NoSuchElementException↓↓↓↓");
//                    System.out.println(e.getMessage());
//                }
//                if(detailsElement == null ){
//                    //获取只有文章的小说类型 文章信息,这个获取的是文章里的 配图
//                    detailsElement = webElement.findElement(By.cssSelector(".feed-card-cover"));
//                }
//                if(detailsElement == null){
//                    return;
//                }
//                //点击进入详情
//                detailsElement.click();
//
//                Set<String> allWindows = driver.getWindowHandles();
//                Iterator<String> iterator = allWindows.iterator();
//                String parentWindow = iterator.next(); // 父窗口句柄
//                String newWindow = iterator.next(); // 新窗口句柄
//                driver.switchTo().window(newWindow);
//
//                detailsPage(driver,titleStr);
//
//
//                //关闭当前详情链接，进入下一个 详情
//                driver.close();
//                driver.switchTo().window(parentWindow);
//                try {
//                    System.out.println("driver.getCurrentUrl()");
//                    System.out.println(driver.getCurrentUrl());
//                    Thread.sleep(500);
//                    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", webElement);
//                } catch (InterruptedException e) {
//                    throw new RuntimeException(e);
//                }
//            });
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            Thread.sleep(30000);
//            driver.quit();
//        }








//        TOUTIAOPageNewsSpider tOUTIAOPageNewsSpider = new TOUTIAOPageNewsSpider();
////        tOUTIAOPageNewsSpider.getNewsList("https://www.toutiao.com/w/1830367300165706/?log_from=55f298818f4de_1745802517908","1");
//        tOUTIAOPageNewsSpider.getNewsList("https://www.toutiao.com/article/7477355130456949300/?log_from=32c3e6639d6eb8_1745935807511","1");


        String htmlContent="\"<p style=\\\"line-height: 2;\\\"><span style=\\\"color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);\\\"><strong>2025年天津大学硕士研究生复试资格基本线</strong></span></p><p style=\\\"line-height: 2;\\\"><span style=\\\"color: rgb(51, 51, 51); background-color: rgb(255, 255, 255); font-size: 14px;\\\">根据教育部规定，结合学校实际情况，现将2025年</span><span style=\\\"color: rgb(224, 62, 45); background-color: rgb(255, 255, 255); font-size: 14px;\\\">天津大学</span><span style=\\\"color: rgb(51, 51, 51); background-color: rgb(255, 255, 255); font-size: 14px;\\\">硕士研究生入学考试复试基本分数线公布如下</span></p><p style=\\\"line-height: 2;\\\"><span style=\\\"color: rgb(51, 51, 51); background-color: rgb(255, 255, 255); font-size: 14px;\\\"><strong>一、学术学位</strong></span></p><p style=\\\"line-height: 2;\\\"><img src=\\\"https://gateway.juxue.cloud/resmanage/resourcesManage/download?bucketName=1659087187175546881-img&amp;fileName=1659087189310443522/037f674b-bf3c-4971-a25b-b69d9504b67f.png\\\" alt=\\\"\\\" data-href=\\\"\\\" style=\\\"\\\"></p><p style=\\\"line-height: 2;\\\"><span style=\\\"color: rgb(51, 51, 51); background-color: rgb(255, 255, 255); font-size: 14px;\\\"><strong>二、专业学位</strong></span></p><p style=\\\"line-height: 2;\\\"><img src=\\\"https://gateway.juxue.cloud/resmanage/resourcesManage/download?bucketName=1659087187175546881-img&amp;fileName=1659087189310443522/52e11a11-7485-498f-9f09-4694ac1ecb60.png\\\" alt=\\\"\\\" data-href=\\\"\\\" style=\\\"\\\"></p><p style=\\\"line-height: 2;\\\"><span style=\\\"color: rgb(51, 51, 51); background-color: rgb(255, 255, 255); font-size: 14px;\\\"><strong>三、专项计划</strong></span></p><p style=\\\"line-height: 2;\\\"><img src=\\\"https://gateway.juxue.cloud/resmanage/resourcesManage/download?bucketName=1659087187175546881-img&amp;fileName=1659087189310443522/47afb6eb-f334-4bca-af29-4a7f644757ef.png\\\" alt=\\\"\\\" data-href=\\\"\\\" style=\\\"\\\"></p><p style=\\\"text-align: start; line-height: 2;\\\"><strong>四、相关说明</strong></p><p style=\\\"text-align: start; line-height: 2;\\\">1. 我校将在保证录取工作公平公正公开的前提下，有序启动硕士生复试招生工作。现公布天津大学复试分数基本要求，复试、调剂和录取等相关工作办法将后续在<span style=\\\"color: rgb(224, 62, 45);\\\">天津大学研究生招生信息网</span>（网址：http://yzb.tju.edu.cn）以及天津大学研究生招生微信公众号公布，请各位考生及时关注相关通知。</p><p style=\\\"text-align: start; line-height: 2;\\\">2. 参加复试的考生需符合天津大学复试分数基本要求，未过线考生不具备我校复试（含调剂复试）资格。各招生学院（部）将在学校划定的复试基本分数线基础上，结合招生计划、合格生源、复试比例等情况，确定本单位复试分数线及相关要求，并确定复试考生名单。我校实行差额复试，<span style=\\\"color: rgb(224, 62, 45);\\\">差额比例一般不低于120%</span>（对合格生源不足120％的学科专业按实际合格考生名单组织复试）。</p><p style=\\\"text-align: start; line-height: 2;\\\">3. <span style=\\\"color: rgb(224, 62, 45);\\\">享受少数民族照顾政策考生：</span>工作单位和户籍在国务院公布的民族区域自治地方，且定向就业单位为原单位的少数民族在职人员考生，按照规定享受少数民族照顾政策。申请享受少数民族照顾政策的考生，须在网上报名时按要求填报相关信息，未按规定申报或审核未通过的，不享受照顾政策。</p><p style=\\\"text-align: start; line-height: 2;\\\">4. 参<span style=\\\"color: rgb(224, 62, 45);\\\">加“大学生志愿服务西部计划”“三支一扶计划”“农村义务教育阶段学校教师特设岗位计划”“国际中文教育志愿者”等项目之一</span>，服务期满且考核合格的考生；“退役大学生士兵”达到全国硕士研究生招生考试报考条件，3年内参加全国硕士研究生招生考试可按教育部统一规定享受加分政策。符合上述条件并申请享受初试加分政策的考生，须在网上报名时按要求填报相关信息。未按规定申报或审核未通过的，不享受加分政策。加分项不累计。报考专项计划的考生，不再享受初试加分和少数民族照顾政策。</p><p style=\\\"text-align: start; line-height: 2;\\\">各学院（部）联系方式详见<strong>天津大学2025年硕士学位研究生招生简章。</strong></p><p style=\\\"text-align: start; line-height: 2;\\\">根据教育部及天津市教育考试院有关2025年研究生复试工作相关要求，结合学校实际情况，2025年我校硕士研究生复试预计于3月下旬举行，具体复试方案及相关安排详见学校及相关学院（部）通知。</p><p style=\\\"text-align: start; line-height: 2;\\\">以上内容是天津大学2025年硕士研究生复试分数线的全部内容，如果大家想了解<span style=\\\"color: rgb(224, 62, 45);\\\">2026考研热门招生院校、热门专业、招生简章、参考书目、择校择专业指导、以及考前集训等</span>相关方面，可以随时联系在线老师进行咨询。</p>\"";
        Document doc = Jsoup.parse(htmlContent);
        System.out.println(doc.text());

    }



}
